package com.cyou.dream.core;

import com.cyou.dream.configuration.RiskConfig;
import com.cyou.dream.configuration.StrategyConfig;
import com.cyou.dream.context.RiskResult;
import com.cyou.dream.rule.param.AbstractRuleParam;

import java.util.List;
import java.util.Map;

/**
 * <p>IRiskEngine 接口定义了风控引擎的核心功能。</p>
 * <p>开发时在业务中注入本引擎即可获得风控系统的核心能力。</p>
 */
public interface IRiskEngine {

    /**
     * 根据策略ID和参数执行风险检查。对于无需传递值参数的规则可以使用这个方法。
     *
     * @param strategyId 策略的唯一标识符。
     * @param keyParams     对应yaml文件中keyPattern的占位符
     * @return 返回风险检查结果，包含是否允许通过以及具体的规则检查结果。
     */
    RiskResult check(String strategyId, Map<String, String> keyParams);

    /**
     * 根据策略ID和参数执行风险检查。
     *
     * @param strategyId 策略的唯一标识符。
     * @param keyParams     对应yaml文件中keyPattern的占位符
     * @param valueParams   传递参数给规则处理类做判断
     * @return 返回风险检查结果，包含是否允许通过以及具体的规则检查结果。
     */
    RiskResult check(String strategyId, Map<String, String> keyParams, AbstractRuleParam valueParams);

    /**
     * <p>重载当前的风控配置，并返回重载后的配置。</p>
     * <p>配置上传后{@link RiskConfigManager}会调用此方法进行热重载，目前是1分钟扫描一次文件改动</p>
     *
     * @return 返回重载后的风控配置对象。
     */
    @SuppressWarnings("UnusedReturnValue")
    RiskConfig reloadConfig();

    /**
     * 获取当前的风控配置。
     *
     * @return 返回当前的风控配置对象。
     */
    RiskConfig getCurrentConfig();

    /**
     * 检查风控配置是否合法。
     *
     * @return 风控配置是否合法。
     */
    boolean checkRiskConfig(List<StrategyConfig> strategies);

}
